package br.urca.controller;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.controller.IndexController;
import br.com.caelum.vraptor.validator.Severity;
import br.com.caelum.vraptor.validator.SimpleMessage;
import br.com.caelum.vraptor.validator.Validator;
import br.urca.dao.AlunosCursoDAO;
import br.urca.dao.CursoTurnoDAO;
import br.urca.interceptor.InterceptResource;
import br.urca.interceptor.NoInterceptMethod;
import br.urca.model.AlunoCurso;
import br.urca.model.CursoTurno;
import br.urca.session.UsuarioLogado;

@Controller
@InterceptResource
public class LoginController {
	
	private AlunosCursoDAO mAlunosCursoDAO;
	private UsuarioLogado mLogado;
	private Result result;
	private HttpServletRequest request;
	private Validator validator;
	private CursoTurnoDAO mCursoTurnoDAO;
	
	@Deprecated LoginController() {}

	@Inject
	public LoginController(AlunosCursoDAO mAlunosCursoDAO,
			CursoTurnoDAO mCursoTurnoDAO, UsuarioLogado mLogado,
			HttpServletRequest request, Result result, Validator validator) {
		super();
		this.mAlunosCursoDAO = mAlunosCursoDAO;
		this.mCursoTurnoDAO = mCursoTurnoDAO;
		this.mLogado = mLogado;
		this.result = result;
		this.request = request;
		this.validator = validator;
	}
	
	@NoInterceptMethod
	@Get("/login")	
	public void formulario() {
		if (mLogado.isLogado() && request.getSession().getAttribute("aluno") != null) {
			result.redirectTo(IndexController.class).index();
		}
	}
	
	@NoInterceptMethod
	@Post("/login")
	public void login(String login, String senha) {		
		if (!mLogado.isLogado()) {
			
			validator.onErrorRedirectTo(this).formulario();
			
			if (!validator.hasErrors()) {
				AlunoCurso alunoCurso = mAlunosCursoDAO.buscaDadosAluno(removeMascara(login), senha);
				
				validator.ensure(alunoCurso != null, 
						new SimpleMessage("Erro",
								"Matrícula ou senha inválida.", Severity.ERROR));
				
				validator.onErrorRedirectTo(this).formulario();
				
				request.getSession(true).setAttribute("aluno", alunoCurso.getAluno().getNome());
				
				
				mLogado.loga(alunoCurso);
				
				CursoTurno cursoTurno = mCursoTurnoDAO.buscarPorCursoTurno(
						mLogado.getAluno().getCodCursoTurno(), mLogado
								.getAluno().getCurso());
				request.getSession().setAttribute("mostrarMenuColacao", (cursoTurno.getColacaoGrauAtivo().equals(new Character('S')) ? "S" : "N"));
			}
		}
		result.include("login",login).redirectTo(IndexController.class).index();
	}
	
	private String removeMascara(String login) {
		if (login != null)
			return login.replaceAll("-", "");
		else
			return "";
	}
	
	@NoInterceptMethod
	@Get("/logout")
	public void logout() {
		mLogado.logout();
		this.request.removeAttribute("aluno");
		this.request.removeAttribute("mostrarMenuColacao");
		this.request.removeAttribute("foto");
		if (this.request.getSession() != null)
			this.request.getSession().invalidate();
		result.redirectTo(this).formulario();
	}
	
}
